/*
	drmmacros.h

	Copyright (C) 2004 WildTangent, Inc. 
	All Rights Reserved

	Travis Baldree
	8/24/2004

*/

#ifndef DRMMACROS_H
#define DRMMACROS_H



///////////////////////////////////////////////////////////////////////////////////////
//	Different headers for different versions.
///////////////////////////////////////////////////////////////////////////////////////
#ifdef _TRIMEDIA
#ifdef _TRIMEDIA_VERSION_52
#include "..\..\..\SDK\_TRIMEDIA52\activemark.h"
#else
#include "..\..\..\SDK\_TRIMEDIA\activemark.h"
#endif
#endif
#ifdef _KEYHOLE
#include "..\..\..\SDK\_KEYHOLE\KeyholeAPI.h"
#endif



///////////////////////////////////////////////////////////////////////////////////////
//	Constants that are the same in all versions.
///////////////////////////////////////////////////////////////////////////////////////
#define VALUE_GAMEISLOCKED		0
#define VALUE_GAMEISUNLOCKED	1
#define VALUE_GAMEHASEXPIRED	0
#define VALUE_GAMEHASNOTEXPIRED	1





///////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////
//	Setup for trimedia versions.
///////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////
#ifdef _TRIMEDIA

#ifdef _TRIMEDIA_VERSION_52



///////////////////////////////////////////////////////////////////////////////////////
//	Macro to get unlock data.
///////////////////////////////////////////////////////////////////////////////////////
#define GETUNLOCKED( Unlocked ) \
	(Unlocked) = VALUE_GAMEISLOCKED; \
	if ( ActiveMARK_getLicenseStatus( NULL ) & AM_STATUS_PURCHASED ) \
	{ \
		Unlocked = VALUE_GAMEISUNLOCKED; \
	} \

///////////////////////////////////////////////////////////////////////////////////////
//	Macro to get expired data.
///////////////////////////////////////////////////////////////////////////////////////
#define GETEXPIRED( Expired ) \
	(Expired) = VALUE_GAMEHASEXPIRED; \
	if ( !( ActiveMARK_getLicenseStatus( NULL ) & AM_STATUS_EXPIRED ) ) \
	{ \
		Expired = VALUE_GAMEHASNOTEXPIRED; \
	} \

///////////////////////////////////////////////////////////////////////////////////////
//	Macro to get uses data.
///////////////////////////////////////////////////////////////////////////////////////
#define GETUSESREMAINING( Uses, Max ) \
	(Uses) = ActiveMARK_getRemainingUses( NULL ); \
	if ( (Uses) == -2 ) \
	{ \
		(Uses) = 1; \
	} \

///////////////////////////////////////////////////////////////////////////////////////
//	Macro to get time data.
///////////////////////////////////////////////////////////////////////////////////////
#define GETTIMEREMAINING( Time ) \
	(Time) = ActiveMARK_getRemainingTime( NULL ); \
	if ( (Time) == -2 ) \
	{ \
		(Time) = 1; \
	} \

#else



///////////////////////////////////////////////////////////////////////////////////////
//	Macro to get unlock data.
///////////////////////////////////////////////////////////////////////////////////////
#define GETUNLOCKED( Unlocked ) \
	(Unlocked) = VALUE_GAMEISLOCKED; \
	if ( ActiveMARKisLicensePurchased() ) \
	{ \
		Unlocked = VALUE_GAMEISUNLOCKED; \
	} \

///////////////////////////////////////////////////////////////////////////////////////
//	Macro to get expired data.
///////////////////////////////////////////////////////////////////////////////////////
#define GETEXPIRED( Expired ) \
	(Expired) = VALUE_GAMEHASEXPIRED; \
	if ( !( ActiveMARKisLicenseExpired() == 1 ) ) \
	{ \
		Expired = VALUE_GAMEHASNOTEXPIRED; \
	} \

 ///////////////////////////////////////////////////////////////////////////////////////
//	Macro to get uses data.
///////////////////////////////////////////////////////////////////////////////////////
#define GETUSES( Uses, Max ) \
	(Uses) = ActiveMARKusesRemaining(); \
	if ( (Uses) < (Max) ) ) \
	{ \
		(Uses) = (Max); \
	} \



#endif





///////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////
//	Setup for keyhole version.
///////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////
#elif _KEYHOLE


///////////////////////////////////////////////////////////////////////////////////////
//	Macro to get unlock data.
///////////////////////////////////////////////////////////////////////////////////////
#define GETUNLOCKED( drm, Unlocked ) \
	(Unlocked) = VALUE_GAMEISLOCKED; \
	if( !((drm)->IsGameLocked()) ) \
	{ \
		Unlocked = VALUE_GAMEISUNLOCKED; \
	} \



///////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////
//	Setup for wt version.
///////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////
#else



///////////////////////////////////////////////////////////////////////////////////////
//	Query get/set types.
//	NOTE!! The strings and secret number may vary from game to game, so you need to
//	change them to be relevant to your app.
///////////////////////////////////////////////////////////////////////////////////////
#define QUERY_PLAYS				"plays"
#define QUERY_PLAYSMAX			"playsmax"
#define QUERY_SESSIONS			"sessions"
#define QUERY_SESSIONSMAX		"sessionsmax"
#define QUERY_PLAYTIME			"playtime"
#define QUERY_PLAYTIMEMAX		"playtimemax"
#define QUERY_LEVELS			"levels"
#define QUERY_LEVELSMAX			"levelsmax"
#define QUERY_UNLOCKED			"source"
#define QUERY_SECRETNUMBER		"label"
#define VALUE_SECRETNUMBER		858688
#define VALUE_DOESNOTAPPLY		-1



///////////////////////////////////////////////////////////////////////////////////////
//	Macro to get process a query.
///////////////////////////////////////////////////////////////////////////////////////
#define PROCESSQUERY( DRM, QueryType, Remaining, Value, Max, Cap ) \
	bool QuerySucceeded = (DRM)->GetIntProperty( (QueryType), &(Max), (Cap) ); \
	if ( QuerySucceeded ) \
	{ \
		if ( (Max) >= 0 ) \
		{ \
			if ( (Max) > (Cap) ) \
			{ \
				(Max) = (Cap); \
			} \
			(Remaining) = (Max) - (Value); \
			if ( (Remaining) < 0 ) \
			{ \
				(Remaining) = 0; \
			} \
		} \
		else \
		{ \
			(Remaining) = 1; \
		} \
	} \
	else \
	{ \
		(Remaining) = 0; \
	} \



///////////////////////////////////////////////////////////////////////////////////////
//	Macro to set data.
///////////////////////////////////////////////////////////////////////////////////////
#define SETDATA( DRM, Type, Remaining ) \
	if ( (Remaining) < 0 ) \
	{ \
		(Remaining) = 0; \
	} \
	(DRM)->SetIntProperty( (Type), (Remaining) ); \



///////////////////////////////////////////////////////////////////////////////////////
//	Macro to get plays remaining.
///////////////////////////////////////////////////////////////////////////////////////
#define GETPLAYS( DRM, Remaining, QUERY_PLAYS, Max, Cap ) \
	{ \
		(DRM)->GetIntProperty( QUERY_PLAYS, &(Plays), 0 ); \
		PROCESSQUERY( (DRM), QUERY_PLAYSMAX, (Remaining), (Plays), (Max), (Cap) ); \
	} \



///////////////////////////////////////////////////////////////////////////////////////
//	Macro to get playtime remaining.
///////////////////////////////////////////////////////////////////////////////////////
#define GETPLAYTIME( DRM, Remaining, Playtime, Max, Cap ) \
	{ \
		(DRM)->GetIntProperty( QUERY_PLAYTIME, &(Playtime), 0 ); \
		PROCESSQUERY( (DRM), QUERY_PLAYTIMEMAX, (Remaining), (Playtime), (Max), (Cap) ); \
	} \



///////////////////////////////////////////////////////////////////////////////////////
//	Macro to get levels remaining.
///////////////////////////////////////////////////////////////////////////////////////
#define GETLEVELS( DRM, Remaining, Levels, Max, Cap ) \
	{ \
		(DRM)->GetIntProperty( QUERY_LEVELS, &(Levels), 0 ); \
		PROCESSQUERY( (DRM), QUERY_LEVELSMAX, (Remaining), (Levels), (Max), (Cap) ); \
	} \



///////////////////////////////////////////////////////////////////////////////////////
//	Macro to get sessions remaining.
///////////////////////////////////////////////////////////////////////////////////////
#define GETSESSIONS( DRM, Remaining, Sessions, Max, Cap ) \
	{ \
		(DRM)->GetIntProperty( QUERY_SESSIONS, &(Sessions), 0 ); \
		PROCESSQUERY( (DRM), QUERY_SESSIONSMAX, (Remaining), (Sessions), (Max), (Cap) ); \
	} \


/*
			if ( (DRM)->GetIntProperty( QUERY_SESSIONSMAX, &(TempVariable), 0 ) == false ) \
			{ \
				(Unlocked) = VALUE_GAMEISLOCKED; \
			} \
			if ( TempVariable != VALUE_DOESNOTAPPLY ) \
			{ \
				(Unlocked) = VALUE_GAMEISLOCKED; \
			} \
			\
*/

///////////////////////////////////////////////////////////////////////////////////////
//	Macro to get unlock data.
///////////////////////////////////////////////////////////////////////////////////////
#define GETUNLOCKED( DRM, Unlocked ) \
	(Unlocked) = VALUE_GAMEISLOCKED; \
	if ( (DRM)->GetIntProperty( QUERY_UNLOCKED, &(Unlocked), 0 ) ) \
	{ \
		\
		if ( (Unlocked) == VALUE_GAMEISUNLOCKED ) \
		{ \
			int TempVariable; \
			\
			if ( (DRM)->GetIntProperty( QUERY_SECRETNUMBER, &(TempVariable), 0 ) == false ) \
			{ \
				(Unlocked) = VALUE_GAMEISLOCKED; \
			} \
			\
			else if ( TempVariable != VALUE_SECRETNUMBER ) \
			{ \
				(Unlocked) = VALUE_GAMEISLOCKED; \
			} \
			\
		} \
	} \

#endif


#endif
